package joist.domain.util.pools;
import javax.sql.DataSource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import joist.domain.util.ConnectionSettings;
/**
* Creates connection pools baked by HikariCP.
*/
public class HikariDataSourceFactory implements DataSourceFactory {
@Override
public HikariDataSource create(ConnectionSettings settings) {
HikariConfig config = new HikariConfig();
this.addCommonOptions(settings, config);
if (settings.db.isPg()) {
this.addPostgresOptions(settings, config);
} else if (settings.db.isMySQL()) {
this.addMySQLOptions(settings, config);
}
this.addCustomOptions(settings, config);
return new HikariDataSource(config);
}
protected void addCommonOptions(ConnectionSettings settings, HikariConfig config) {
config.setUsername(settings.user);
config.setPassword(settings.password);
config.setConnectionTimeout((settings.timeoutInSeconds + 1) * 1000);
config.setMinimumIdle(settings.initialPoolSize);
config.setMaximumPoolSize(settings.maxPoolSize);
config.addDataSourceProperty("databaseName", settings.databaseName);
config.addDataSourceProperty("serverName", settings.host);
config.setPoolName("joist-pool");
}
protected void addPostgresOptions(ConnectionSettings settings, HikariConfig config) {
config.setDataSourceClassName("org.postgresql.ds.PGSimpleDataSource");
config.addDataSourceProperty("socketTimeout", settings.timeoutInSeconds);
}
protected void addMySQLOptions(ConnectionSettings settings, HikariConfig config) {
config.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
config.addDataSourceProperty("connectTimeout", (settings.timeoutInSeconds * 1000));
config.addDataSourceProperty("socketTimeout", (settings.timeoutInSeconds * 1000));
config.addDataSourceProperty("zeroDateTimeBehavior", "convertToNull");
// https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration
config.addDataSourceProperty("prepStmtCacheSize", 500);
config.addDataSourceProperty("prepStmtCacheSqlLimit", 2048);
config.addDataSourceProperty("cachePrepStmts", true);
}
protected void addCustomOptions(ConnectionSettings settings, HikariConfig config) {
}
public void destroy(DataSource dataSource) {
((HikariDataSource) dataSource).close();
}
}